LeetCode第6題是「Z字形變換」(Zigzag Conversion)。這題目要求將給定的字符串按照特定的Z字形排列,然後按行讀取返回最終的結果。
題目描述
將字符串 "PAYPALISHIRING" 以 Z 字形排列成給定的行數(numRows),例如當 numRows = 3 時,排列如下:
P A H N
A P L S I I G
Y I R
然後逐行讀取,輸出 "PAHNAPLSIIGYIR"。
解題想法
1.如果numRows為1,那麼不需要任何變換,直接返回原字符串。
2.創建一個數組,數組的每個元素對應每一行。
3.從上往下逐行將字符放入數組中,當到達最後一行後,反方向從下往上移動,並重複這個過程。
4.將所有行連接起來形成最終結果。
public class Solution {
public String convert(String s, int numRows) {
if (numRows == 1 || s.length() <= numRows) {
return s;
}
// 創建 numRows 個 StringBuilder 對應每一行
List<StringBuilder> rows = new ArrayList<>();
for (int i = 0; i < Math.min(numRows, s.length()); i++) {
rows.add(new StringBuilder());
}
int curRow = 0;
boolean goingDown = false;
//將字符逐個加入對應的行
for (char c : s.toCharArray()) {
rows.get(curRow).append(c);
// 如果到了第一行或最後一行,改變方向
if (curRow == 0 || curRow == numRows - 1) {
goingDown = !goingDown;
}
//根據方向更新當前行數
curRow += goingDown ? 1 : -1;
}
//將所有行的結果合併成一個字符串
StringBuilder result = new StringBuilder();
for (StringBuilder row : rows) {
result.append(row);
}
return result.toString();
}
}